<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/3/2 0002
 * Time: 11:32
 */
//优先队列也是非常实用的一种数据结构，可以通过加权对值进行排序，由于排序在php内部实现，业务代码中将精简不少而且更高效。通过SplPriorityQueue::setExtractFlags(int  $flag)设置提取方式可以提取数据（等同最大堆）、优先级、和两者都提取的方式。
//---------------------
//作者：wzllai
//来源：CSDN
//原文：https://blog.csdn.net/wzllai/article/details/8272945
//版权声明：本文为博主原创文章，转载请附上博文链接！

$priorityQueue = new SplPriorityQueue();
$priorityQueue->insert(2, 9);
$priorityQueue->insert(3, 8);
$priorityQueue->insert(4, 7);
$priorityQueue->insert(5, 6);
$priorityQueue->setExtractFlags(SplPriorityQueue::EXTR_DATA);
//var_dump($priorityQueue);
//print_r($priorityQueue->extract());
//print_r($priorityQueue->extract());
//print_r($priorityQueue->extract());
//print_r($priorityQueue->extract());
//堆(Heap)就是为了实现优先队列而设计的一种数据结构，它是通过构造二叉堆(二叉树的一种)实现。根节点
//最大的堆叫做最大堆或大根堆，根节点最小的堆叫做最小堆或小根堆。二叉堆还常用于排序(堆排序
//)。SplHeap 是一个抽象类，实现了Iterator , Countable接口。最大堆(SplMaxHeap)和最小堆(SplMinHeap)就是继承它实现的，可以在PHP程序中直接使用。
//---------------------
//作者：奔跑的码农
//来源：CSDN
//原文：https://blog.csdn.net/wuxing26jiayou/article/details/51899811
//版权声明：本文为博主原创文章，转载请附上博文链接！

///实现一个自己的最大堆
class  iMaxHeap extends SplHeap
{
    protected function compare($value1, $value2)
    {
        $value1 = array_values($value1);
        $value2 = array_values($value2);
        if ($value1[0] === $value2[0]) return 0;
        return $value1[0] < $value2[0] ? -1 : 1;

    }

}

$heap = new iMaxHeap();

$heap->insert(array('a' => 12));
$heap->insert(array('b' => 20));
$heap->insert(array('c' => 23));
$heap->insert(array('d' => 32));
$heap->insert(array('e' => 15));
$heap->insert(array('f' => 17));
$heap->insert(array('g' => 31));
$heap->insert(array('h' => 11));
$heap->insert(array('i' => 18));
$heap->insert(array('j' => 24));

//var_dump($heap->top());
while ($heap->valid()) {
    $current = $heap->current();
    list($team, $score) = each($current);
    echo $team . ': ' . $score . "\r\n";
    $heap->next();
}
//以上输出：
//array (size=1)
//  'd' => int 32
//d: 32
//g: 31
//j: 24
//c: 23
//b: 20
//i: 18
//f: 17
//e: 15
//a: 12
//h: 11